package top.jle.jpa.basic.dao;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Set;

public interface EntityDao {


    <T extends Serializable>  T merge(T entity);


    <T extends Serializable>  void evict(T entity);


    <T extends Serializable>  void updateAndRefresh(T entity);


    <T extends Serializable>  void refresh(T entity);


    <T extends Serializable>  void save(T entity);


    /**
     * 清除session缓存
     */
    void clear();

    /**
     *
     */
    void flush();


    <T extends Serializable>  void initProxyObject(T proxyEntity);


    <T extends Serializable>  void update(T entity);

    void updateByHQL(String hql, Object... values);


    <T extends Serializable>  void saveOrUpdate(T entity);


    <T extends Serializable>  void delete(T entity);


    <T extends Serializable>  void deleteById(Class<T>  clazz, long id);


    <T extends Serializable>  void deleteByIds(Class<T>  clazz, Long[] ids);

    void deleteByIds(String className, Long[] ids);

    <T extends Serializable>  int deleteAll(Class<T>  clazz);


    void deleteBySQL(final String sql);


    <T extends Serializable> void deleteByPrefilters(Class<T> clazz, PreFilter... preFilters);

    <T extends Serializable> void deleteAll(Collection<T> collection);

    <T extends Serializable> Integer getCountByPrefilters(Class<T> clazz, PreFilter... preFilters);


    <T extends Serializable> boolean existsByPreFilters(Class<T> clazz, PreFilter... preFilters);


    <T extends Serializable>  T getReferenceById(Class<T>  clazz, long id);

    <T extends Serializable>  Set<T>  getReferencesByIds(Class<T>  clazz, Long[] ids);


    <T extends Serializable>  T findById(Class<T>  clazz, long id);

    <T extends Serializable>  List<T>  findAll(Class<T>  clazz, SortKey... sortKeys);

    <T extends Serializable>  List<T>  findByPreFilter(Class<T>  clazz, PreFilter... preFilters);


    <T extends Serializable>  List<T>  findByPreFilter(Class<T>  clazz, SortKey[] sortKeys, PreFilter... preFilters);

    <T extends Serializable>  T findUniqueByPreFilter(Class<T>  clazz, PreFilter... preFilters);

    <T extends Serializable>  List<T>  findByIds(Class<T>  clazz, Long[] ids);

    <T extends Serializable>  PagedResult<T>  getPage(Class<T>  clazz, PageRequest pageRequest, PreFilter... preFilters);

    <T extends Serializable>  int getAllCount(Class<T>  clazz);

    <T extends Serializable>  int getCountByPreFilter(Class<T>  clazz, PreFilter... preFilters);
    <T extends Serializable>  List<T>  findByHQL(String hql, Object... values);
    <T extends Serializable>  T findUniqueByHQL(String hql, Object... values);
    <T extends Serializable> PagedResult<T> getPageByClassName(String className, PageRequest pageRequest, PreFilter... preFilters);
    <T extends Serializable> PagedResult<T> getPageByHQL(final String hql, final PageRequest pageRequest, final Object... values);

    <T extends Serializable>  PagedResult<T> getPageBySQL(final String sql, final PageRequest pageRequest, final Object... values);

    <T extends Serializable> PagedResult<T> getPageBySQL(String sql, Class<T> clazz, PageRequest pageRequest, Object... values);



    <T extends Serializable>  T findById(String className, long id);

    <T extends Serializable>  T findUniqueByPreFilter(String className, SortKey[] sortKeys, PreFilter... preFilters);

    <T extends Serializable>  List<T>  findByPreFilter(String className, SortKey[] sortKeys, PreFilter... preFilters);

    <T extends Serializable>  List<T>  findBySQL(String sql, Object... values);

    <T extends Serializable>  List<T>  findBySQL(Class<T> clazz,String sql, Object... values);

    <T extends Serializable>  void markCreateTimeIfPossible(T entity);


    <T extends Serializable>  void markLastModifyTimeIfPossible(T entity);


    void deleteById(String className, Long id);

    void execSQL(String sql);

}
